{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "mjqPwkpZLq7k"
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import torchvision as tv\n",
    "from torchvision import transforms, utils\n",
    "\n",
    "\n",
    "import torch.nn.functional as F\n",
    "import torch \n",
    "import torch.nn as nn\n",
    "from torch.autograd import Variable\n",
    "import torchvision.models as models\n",
    "# from torchvision import transforms, utils\n",
    "from torch.utils.data import Dataset, DataLoader\n",
    "# from PIL import Image\n",
    "# import numpy as np\n",
    "import torch.optim as optim\n",
    "# import os\n",
    "import time\n",
    "\n",
    "import loadData"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 日志记录模块\n",
    "import logging\n",
    "logger = logging.getLogger(__name__)\n",
    "logger.setLevel(level = logging.INFO)\n",
    "handler = logging.FileHandler(\"./logs/2_Synchronization_Logs/log1245-1.txt\")\n",
    "handler.setLevel(logging.INFO)\n",
    "formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')\n",
    "handler.setFormatter(formatter)\n",
    "\n",
    "console = logging.StreamHandler()\n",
    "console.setLevel(logging.INFO)\n",
    "\n",
    "logger.addHandler(handler)\n",
    "logger.addHandler(console)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "startTime = time.time()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "oMgidBKKLq7s"
   },
   "outputs": [],
   "source": [
    "transforms = tv.transforms.Compose([\n",
    "    transforms.ToTensor(),\n",
    "])\n",
    "\n",
    "\n",
    "numOfBatch = 9\n",
    "pixel = 64\n",
    "flag = 0\n",
    "root = f'./{numOfBatch}/data'\n",
    "batchSize = 2\n",
    "train_data = loadData.MyDataset(txt=f'files_train.txt', transform=None)\n",
    "test_data = loadData.MyDataset(txt=f'files_test.txt', transform=None)\n",
    "\n",
    "\n",
    "train_loader = DataLoader(dataset=train_data, batch_size=batchSize, shuffle=True, num_workers=2)\n",
    "test_loader = DataLoader(dataset=test_data, batch_size=batchSize, shuffle=False, num_workers=2)\n",
    "\n",
    "\n",
    "# print(train_loader)\n",
    "# print(test_loader)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 34
    },
    "colab_type": "code",
    "id": "6h-TJ16XLq7y",
    "outputId": "d4f641b6-e9d4-4aa4-8672-13c98099eb01"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<torch.utils.data.dataloader.DataLoader at 0x7fd8102f7f90>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_loader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 487
    },
    "colab_type": "code",
    "id": "CSdZoIqDLq7-",
    "outputId": "22fd354b-1be5-4f7d-e772-7873db328b62"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n",
      "tensor([[[ 0.0770,  0.3808,  0.7388,  ...,  0.5298,  0.2007, -0.0168],\n",
      "         [ 0.9499,  0.8180,  0.5694,  ..., -0.8121, -0.9451, -1.0115],\n",
      "         [ 0.1523,  0.5197,  0.8944,  ...,  0.4902,  0.1647,  0.0042],\n",
      "         ...,\n",
      "         [-1.0281, -0.9363, -0.7129,  ..., -0.6954, -0.8956, -0.9806],\n",
      "         [ 0.1191,  0.3203,  0.7517,  ...,  0.6730,  0.2974,  0.0171],\n",
      "         [-1.0206, -0.9588, -0.7208,  ..., -0.6628, -0.9296, -1.0229]],\n",
      "\n",
      "        [[-0.8417, -0.6740, -0.2886,  ...,  0.9349,  0.7691,  0.7105],\n",
      "         [ 0.4693,  0.7123,  0.9252,  ..., -0.3722, -0.6502, -0.7528],\n",
      "         [ 0.8263,  1.0066,  0.9010,  ...,  0.8458,  0.6249,  0.5640],\n",
      "         ...,\n",
      "         [-0.9940, -0.9637, -0.7822,  ..., -0.6133, -0.8568, -0.9753],\n",
      "         [ 0.0392,  0.2413,  0.5684,  ...,  0.8016,  0.4633,  0.1652],\n",
      "         [-0.9732, -0.9665, -0.7794,  ..., -0.6188, -0.8810, -0.9464]]],\n",
      "       dtype=torch.float64) tensor([42,  0])\n"
     ]
    }
   ],
   "source": [
    "data = iter(train_loader)\n",
    "\n",
    "# print(type(data))\n",
    "# print(len(data))\n",
    "data_, label = data.next()\n",
    "print(train_loader.batch_size)\n",
    "print(data_, label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "9ZSua6ALLq8I"
   },
   "outputs": [],
   "source": [
    "class Net(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(Net, self).__init__()\n",
    "        self.conv1 = nn.Conv1d(in_channels=160, out_channels=120, kernel_size=2)\n",
    "        self.conv2 = nn.Conv1d(in_channels=120, out_channels=100, kernel_size=2)\n",
    "        self.conv3 = nn.Conv1d(in_channels=100, out_channels=80, kernel_size=2)\n",
    "        self.dropout1 = nn.Dropout(0.5)\n",
    "        self.dropout2 = nn.Dropout(0.5)\n",
    "        \n",
    "#         self.fc1 = nn.Linear(1360, 1024)\n",
    "        self.fc1 = nn.Linear(31760, 10240)\n",
    "        self.fc2 = nn.Linear(10240, 1000)\n",
    "        self.fc3 = nn.Linear(1000, 54)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = self.conv1(x)\n",
    "#         x = F.elu(x)\n",
    "        x = F.relu(x)\n",
    "        x = F.max_pool1d(x, 1)\n",
    "        x = self.conv2(x)\n",
    "        x = F.elu(x)\n",
    "        x = F.max_pool1d(x, 1)\n",
    "        x = self.conv3(x)\n",
    "        x = F.elu(x)\n",
    "        x = F.max_pool1d(x, 1)\n",
    "        x = torch.flatten(x, 1)\n",
    "#         print(\"x的大小为:\", x.shape)\n",
    "        x = self.fc1(x)\n",
    "        x = F.elu(x)\n",
    "        x = self.dropout1(x)\n",
    "        x = self.fc2(x)\n",
    "        x = F.elu(x)\n",
    "        x = self.dropout2(x)\n",
    "        x = self.fc3(x)\n",
    "        output = F.log_softmax(x, dim=1)\n",
    "        return output"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "WBWBdr1LLq82"
   },
   "outputs": [],
   "source": [
    "net = Net()\n",
    "\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "optimizer = optim.SGD(params=net.parameters(), lr=0.001, momentum=0.9)\n",
    "\n",
    "epochs = 20\n",
    "average_loss_series = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 286
    },
    "colab_type": "code",
    "id": "87bfeNToLq87",
    "outputId": "af954cd8-8959-4212-ff89-482e57c90d4e"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[[-0.5268, -0.3250,  0.0760,  ...,  0.4675,  0.1247, -0.0547],\n",
      "         [ 0.9188,  0.9824,  1.0190,  ..., -0.8959, -1.0003, -0.9829],\n",
      "         [-0.0562,  0.3081,  0.7713,  ...,  0.5515,  0.1840,  0.0121],\n",
      "         ...,\n",
      "         [-0.9971, -0.9913, -0.7187,  ..., -0.6594, -0.8892, -1.0165],\n",
      "         [ 0.0673,  0.1758,  0.6581,  ...,  0.7767,  0.5264,  0.1833],\n",
      "         [-0.9786, -0.9924, -0.8104,  ..., -0.6004, -0.8915, -1.0283]],\n",
      "\n",
      "        [[-0.3750, -0.1414,  0.3153,  ...,  0.5131,  0.1780,  0.0164],\n",
      "         [ 0.9535,  0.9792,  0.9128,  ..., -0.8212, -0.9696, -0.9864],\n",
      "         [ 0.0167,  0.3435,  0.7750,  ...,  0.6412,  0.3469,  0.1362],\n",
      "         ...,\n",
      "         [-1.0139, -1.0380, -0.8487,  ..., -0.5511, -0.8223, -0.9899],\n",
      "         [ 0.0456,  0.1780,  0.6224,  ...,  0.8297,  0.5151,  0.2353],\n",
      "         [-0.9996, -0.9978, -0.8608,  ..., -0.5967, -0.8819, -0.9775]]],\n",
      "       dtype=torch.float64)\n"
     ]
    }
   ],
   "source": [
    "for a, b in enumerate(train_loader):\n",
    "    inputs, labels = b\n",
    "    print(inputs)\n",
    "    break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 338
    },
    "colab_type": "code",
    "id": "vrT4DrYlQ_sf",
    "outputId": "f29983ea-a956-45f1-ff43-cf529516ba11"
   },
   "outputs": [],
   "source": [
    "# s = torch.randn(2, 160,20).double()\n",
    "# conv = nn.Conv1d(in_channels=160, out_channels=120, kernel_size=2)\n",
    "# conv(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "colab_type": "code",
    "id": "_c6Gwp3ALq9k",
    "outputId": "60864ad5-6b9b-4875-a39f-9600521d3629"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:17: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).\n",
      "[1, 10] loss: 3.9982324600219727\n",
      "[1, 10] acc: 0.0\n",
      "[1, 20] loss: 4.012391662597656\n",
      "[1, 20] acc: 0.0\n",
      "[1, 30] loss: 4.05283751487732\n",
      "[1, 30] acc: 0.0\n",
      "[1, 40] loss: 4.035447645187378\n",
      "[1, 40] acc: 0.0\n",
      "[1, 50] loss: 4.033033990859986\n",
      "[1, 50] acc: 0.0\n",
      "[1, 60] loss: 4.0226235628128055\n",
      "[1, 60] acc: 0.0\n",
      "[1, 70] loss: 4.094238591194153\n",
      "[1, 70] acc: 0.0\n",
      "[1, 80] loss: 4.022821164131164\n",
      "[1, 80] acc: 0.05000000074505806\n",
      "[1, 90] loss: 4.00854811668396\n",
      "[1, 90] acc: 0.0\n",
      "[1, 100] loss: 4.00397527217865\n",
      "[1, 100] acc: 0.0\n",
      "[2, 10] loss: 3.994018578529358\n",
      "[2, 10] acc: 0.05000000074505806\n",
      "[2, 20] loss: 4.0158233642578125\n",
      "[2, 20] acc: 0.0\n",
      "[2, 30] loss: 3.974933409690857\n",
      "[2, 30] acc: 0.0\n",
      "[2, 40] loss: 4.036698627471924\n",
      "[2, 40] acc: 0.0\n",
      "[2, 50] loss: 3.9996440410614014\n",
      "[2, 50] acc: 0.0\n",
      "[2, 60] loss: 3.9800267457962035\n",
      "[2, 60] acc: 0.0\n",
      "[2, 70] loss: 3.9541351795196533\n",
      "[2, 70] acc: 0.05000000074505806\n",
      "[2, 80] loss: 3.928318190574646\n",
      "[2, 80] acc: 0.05000000074505806\n",
      "[2, 90] loss: 3.9760661363601684\n",
      "[2, 90] acc: 0.0\n",
      "[2, 100] loss: 4.0297321557998655\n",
      "[2, 100] acc: 0.0\n",
      "[3, 10] loss: 3.937961769104004\n",
      "[3, 10] acc: 0.0\n",
      "[3, 20] loss: 3.947478199005127\n",
      "[3, 20] acc: 0.0\n",
      "[3, 30] loss: 3.912378191947937\n",
      "[3, 30] acc: 0.10000000149011612\n",
      "[3, 40] loss: 3.9106120347976683\n",
      "[3, 40] acc: 0.05000000074505806\n",
      "[3, 50] loss: 3.9068687200546264\n",
      "[3, 50] acc: 0.05000000074505806\n",
      "[3, 60] loss: 3.9199358463287353\n",
      "[3, 60] acc: 0.0\n",
      "[3, 70] loss: 3.8604242324829103\n",
      "[3, 70] acc: 0.0\n",
      "[3, 80] loss: 3.855851101875305\n",
      "[3, 80] acc: 0.0\n",
      "[3, 90] loss: 3.8107864618301392\n",
      "[3, 90] acc: 0.0\n",
      "[3, 100] loss: 3.7973386526107786\n",
      "[3, 100] acc: 0.0\n",
      "[4, 10] loss: 3.7726635217666624\n",
      "[4, 10] acc: 0.0\n",
      "[4, 20] loss: 3.644214701652527\n",
      "[4, 20] acc: 0.05000000074505806\n",
      "[4, 30] loss: 3.6589123249053954\n",
      "[4, 30] acc: 0.0\n",
      "[4, 40] loss: 3.684734892845154\n",
      "[4, 40] acc: 0.0\n",
      "[4, 50] loss: 3.727107834815979\n",
      "[4, 50] acc: 0.05000000074505806\n",
      "[4, 60] loss: 3.5619067192077636\n",
      "[4, 60] acc: 0.0\n",
      "[4, 70] loss: 3.581894373893738\n",
      "[4, 70] acc: 0.05000000074505806\n",
      "[4, 80] loss: 3.6140018939971923\n",
      "[4, 80] acc: 0.0\n",
      "[4, 90] loss: 3.70361385345459\n",
      "[4, 90] acc: 0.0\n",
      "[4, 100] loss: 3.51792950630188\n",
      "[4, 100] acc: 0.0\n",
      "[5, 10] loss: 3.1913196563720705\n",
      "[5, 10] acc: 0.10000000149011612\n",
      "[5, 20] loss: 3.6231651067733766\n",
      "[5, 20] acc: 0.05000000074505806\n",
      "[5, 30] loss: 3.4769187450408934\n",
      "[5, 30] acc: 0.0\n",
      "[5, 40] loss: 3.5208117723464967\n",
      "[5, 40] acc: 0.05000000074505806\n",
      "[5, 50] loss: 3.600091028213501\n",
      "[5, 50] acc: 0.05000000074505806\n",
      "[5, 60] loss: 3.660721492767334\n",
      "[5, 60] acc: 0.05000000074505806\n",
      "[5, 70] loss: 3.427450442314148\n",
      "[5, 70] acc: 0.05000000074505806\n",
      "[5, 80] loss: 3.475431704521179\n",
      "[5, 80] acc: 0.0\n",
      "[5, 90] loss: 3.6722108125686646\n",
      "[5, 90] acc: 0.0\n",
      "[5, 100] loss: 3.668020415306091\n",
      "[5, 100] acc: 0.0\n",
      "[6, 10] loss: 3.309088349342346\n",
      "[6, 10] acc: 0.05000000074505806\n",
      "[6, 20] loss: 3.3460264682769774\n",
      "[6, 20] acc: 0.05000000074505806\n",
      "[6, 30] loss: 3.4539854288101197\n",
      "[6, 30] acc: 0.05000000074505806\n",
      "[6, 40] loss: 3.233226990699768\n",
      "[6, 40] acc: 0.15000000596046448\n",
      "[6, 50] loss: 3.3534971714019775\n",
      "[6, 50] acc: 0.05000000074505806\n",
      "[6, 60] loss: 3.374247121810913\n",
      "[6, 60] acc: 0.05000000074505806\n",
      "[6, 70] loss: 3.6779899120330812\n",
      "[6, 70] acc: 0.0\n",
      "[6, 80] loss: 3.812810707092285\n",
      "[6, 80] acc: 0.0\n",
      "[6, 90] loss: 3.2056531429290773\n",
      "[6, 90] acc: 0.15000000596046448\n",
      "[6, 100] loss: 3.4687214136123656\n",
      "[6, 100] acc: 0.05000000074505806\n",
      "[7, 10] loss: 2.873639726638794\n",
      "[7, 10] acc: 0.10000000149011612\n",
      "[7, 20] loss: 3.1873667001724244\n",
      "[7, 20] acc: 0.10000000149011612\n",
      "[7, 30] loss: 3.526597094535828\n",
      "[7, 30] acc: 0.0\n",
      "[7, 40] loss: 3.4517373561859133\n",
      "[7, 40] acc: 0.0\n",
      "[7, 50] loss: 3.794109320640564\n",
      "[7, 50] acc: 0.05000000074505806\n",
      "[7, 60] loss: 3.7157809495925904\n",
      "[7, 60] acc: 0.05000000074505806\n",
      "[7, 70] loss: 3.0515349388122557\n",
      "[7, 70] acc: 0.20000000298023224\n",
      "[7, 80] loss: 3.710317039489746\n",
      "[7, 80] acc: 0.0\n",
      "[7, 90] loss: 3.259236288070679\n",
      "[7, 90] acc: 0.10000000149011612\n",
      "[7, 100] loss: 3.434632349014282\n",
      "[7, 100] acc: 0.0\n",
      "[8, 10] loss: 3.133279728889465\n",
      "[8, 10] acc: 0.15000000596046448\n",
      "[8, 20] loss: 3.2827823638916014\n",
      "[8, 20] acc: 0.10000000149011612\n",
      "[8, 30] loss: 3.1279738187789916\n",
      "[8, 30] acc: 0.10000000149011612\n",
      "[8, 40] loss: 3.1058411598205566\n",
      "[8, 40] acc: 0.10000000149011612\n",
      "[8, 50] loss: 3.454513430595398\n",
      "[8, 50] acc: 0.10000000149011612\n",
      "[8, 60] loss: 3.6730692625045775\n",
      "[8, 60] acc: 0.05000000074505806\n",
      "[8, 70] loss: 3.2861613512039183\n",
      "[8, 70] acc: 0.05000000074505806\n",
      "[8, 80] loss: 3.4476911067962646\n",
      "[8, 80] acc: 0.0\n",
      "[8, 90] loss: 3.5000377178192137\n",
      "[8, 90] acc: 0.0\n",
      "[8, 100] loss: 3.311816096305847\n",
      "[8, 100] acc: 0.20000000298023224\n",
      "[9, 10] loss: 3.415490007400513\n",
      "[9, 10] acc: 0.05000000074505806\n",
      "[9, 20] loss: 2.673309087753296\n",
      "[9, 20] acc: 0.20000000298023224\n",
      "[9, 30] loss: 3.388030242919922\n",
      "[9, 30] acc: 0.05000000074505806\n",
      "[9, 40] loss: 3.2483802318572996\n",
      "[9, 40] acc: 0.15000000596046448\n",
      "[9, 50] loss: 3.4488789796829225\n",
      "[9, 50] acc: 0.10000000149011612\n",
      "[9, 60] loss: 3.243828225135803\n",
      "[9, 60] acc: 0.05000000074505806\n",
      "[9, 70] loss: 3.3245192050933836\n",
      "[9, 70] acc: 0.05000000074505806\n",
      "[9, 80] loss: 3.3847227573394774\n",
      "[9, 80] acc: 0.15000000596046448\n",
      "[9, 90] loss: 3.1375173568725585\n",
      "[9, 90] acc: 0.15000000596046448\n",
      "[9, 100] loss: 3.265507221221924\n",
      "[9, 100] acc: 0.10000000149011612\n",
      "[10, 10] loss: 2.8790518641471863\n",
      "[10, 10] acc: 0.10000000149011612\n",
      "[10, 20] loss: 2.951694393157959\n",
      "[10, 20] acc: 0.20000000298023224\n",
      "[10, 30] loss: 2.9271769762039184\n",
      "[10, 30] acc: 0.10000000149011612\n",
      "[10, 40] loss: 3.0653883934021\n",
      "[10, 40] acc: 0.10000000149011612\n",
      "[10, 50] loss: 3.554287838935852\n",
      "[10, 50] acc: 0.0\n",
      "[10, 60] loss: 2.975652241706848\n",
      "[10, 60] acc: 0.10000000149011612\n",
      "[10, 70] loss: 3.316970872879028\n",
      "[10, 70] acc: 0.0\n",
      "[10, 80] loss: 3.1462869167327883\n",
      "[10, 80] acc: 0.05000000074505806\n",
      "[10, 90] loss: 2.8284939169883727\n",
      "[10, 90] acc: 0.20000000298023224\n",
      "[10, 100] loss: 3.178526222705841\n",
      "[10, 100] acc: 0.10000000149011612\n",
      "[11, 10] loss: 3.100771164894104\n",
      "[11, 10] acc: 0.05000000074505806\n",
      "[11, 20] loss: 2.8557568550109864\n",
      "[11, 20] acc: 0.20000000298023224\n",
      "[11, 30] loss: 3.303613543510437\n",
      "[11, 30] acc: 0.10000000149011612\n",
      "[11, 40] loss: 3.0167863368988037\n",
      "[11, 40] acc: 0.10000000149011612\n",
      "[11, 50] loss: 2.9781392335891725\n",
      "[11, 50] acc: 0.10000000149011612\n",
      "[11, 60] loss: 3.491483950614929\n",
      "[11, 60] acc: 0.05000000074505806\n",
      "[11, 70] loss: 3.118342399597168\n",
      "[11, 70] acc: 0.05000000074505806\n",
      "[11, 80] loss: 3.089436888694763\n",
      "[11, 80] acc: 0.15000000596046448\n",
      "[11, 90] loss: 2.9804457426071167\n",
      "[11, 90] acc: 0.20000000298023224\n",
      "[11, 100] loss: 3.0379934072494508\n",
      "[11, 100] acc: 0.10000000149011612\n",
      "[12, 10] loss: 2.734662854671478\n",
      "[12, 10] acc: 0.15000000596046448\n",
      "[12, 20] loss: 2.8422479152679445\n",
      "[12, 20] acc: 0.4000000059604645\n",
      "[12, 30] loss: 2.8977695226669313\n",
      "[12, 30] acc: 0.15000000596046448\n",
      "[12, 40] loss: 3.1352737188339233\n",
      "[12, 40] acc: 0.05000000074505806\n",
      "[12, 50] loss: 2.949787771701813\n",
      "[12, 50] acc: 0.10000000149011612\n",
      "[12, 60] loss: 2.951771068572998\n",
      "[12, 60] acc: 0.05000000074505806\n",
      "[12, 70] loss: 2.91847026348114\n",
      "[12, 70] acc: 0.25\n",
      "[12, 80] loss: 3.2425312280654905\n",
      "[12, 80] acc: 0.15000000596046448\n",
      "[12, 90] loss: 3.3098876953125\n",
      "[12, 90] acc: 0.05000000074505806\n",
      "[12, 100] loss: 2.74528591632843\n",
      "[12, 100] acc: 0.10000000149011612\n",
      "[13, 10] loss: 2.85173522233963\n",
      "[13, 10] acc: 0.15000000596046448\n",
      "[13, 20] loss: 2.22135443687439\n",
      "[13, 20] acc: 0.3499999940395355\n",
      "[13, 30] loss: 2.5537334024906158\n",
      "[13, 30] acc: 0.20000000298023224\n",
      "[13, 40] loss: 3.209722805023193\n",
      "[13, 40] acc: 0.10000000149011612\n",
      "[13, 50] loss: 2.8456639289855956\n",
      "[13, 50] acc: 0.20000000298023224\n",
      "[13, 60] loss: 3.0390970706939697\n",
      "[13, 60] acc: 0.10000000149011612\n",
      "[13, 70] loss: 3.199859046936035\n",
      "[13, 70] acc: 0.10000000149011612\n",
      "[13, 80] loss: 2.604464757442474\n",
      "[13, 80] acc: 0.20000000298023224\n",
      "[13, 90] loss: 2.5453250288963316\n",
      "[13, 90] acc: 0.25\n",
      "[13, 100] loss: 3.043395233154297\n",
      "[13, 100] acc: 0.05000000074505806\n",
      "[14, 10] loss: 2.9559524178504946\n",
      "[14, 10] acc: 0.10000000149011612\n",
      "[14, 20] loss: 2.566199266910553\n",
      "[14, 20] acc: 0.20000000298023224\n",
      "[14, 30] loss: 2.563660991191864\n",
      "[14, 30] acc: 0.30000001192092896\n",
      "[14, 40] loss: 2.511433553695679\n",
      "[14, 40] acc: 0.3499999940395355\n",
      "[14, 50] loss: 3.220030999183655\n",
      "[14, 50] acc: 0.10000000149011612\n",
      "[14, 60] loss: 4.00903434753418\n",
      "[14, 60] acc: 0.05000000074505806\n",
      "[14, 70] loss: 2.8397722601890565\n",
      "[14, 70] acc: 0.15000000596046448\n",
      "[14, 80] loss: 3.340221571922302\n",
      "[14, 80] acc: 0.05000000074505806\n",
      "[14, 90] loss: 3.1778707265853883\n",
      "[14, 90] acc: 0.20000000298023224\n",
      "[14, 100] loss: 2.579662483930588\n",
      "[14, 100] acc: 0.15000000596046448\n",
      "[15, 10] loss: 2.6617488622665406\n",
      "[15, 10] acc: 0.30000001192092896\n",
      "[15, 20] loss: 3.028161573410034\n",
      "[15, 20] acc: 0.10000000149011612\n",
      "[15, 30] loss: 2.8467948913574217\n",
      "[15, 30] acc: 0.20000000298023224\n",
      "[15, 40] loss: 2.790445452928543\n",
      "[15, 40] acc: 0.15000000596046448\n",
      "[15, 50] loss: 2.3273575782775877\n",
      "[15, 50] acc: 0.25\n",
      "[15, 60] loss: 2.8530112147331237\n",
      "[15, 60] acc: 0.20000000298023224\n",
      "[15, 70] loss: 2.6820069432258604\n",
      "[15, 70] acc: 0.20000000298023224\n",
      "[15, 80] loss: 3.0297194510698318\n",
      "[15, 80] acc: 0.15000000596046448\n",
      "[15, 90] loss: 2.7057143688201903\n",
      "[15, 90] acc: 0.15000000596046448\n",
      "[15, 100] loss: 2.9931785583496096\n",
      "[15, 100] acc: 0.0\n",
      "[16, 10] loss: 2.172434997558594\n",
      "[16, 10] acc: 0.4000000059604645\n",
      "[16, 20] loss: 2.408321189880371\n",
      "[16, 20] acc: 0.25\n",
      "[16, 30] loss: 3.166913866996765\n",
      "[16, 30] acc: 0.05000000074505806\n",
      "[16, 40] loss: 3.032239007949829\n",
      "[16, 40] acc: 0.05000000074505806\n",
      "[16, 50] loss: 2.8828466653823854\n",
      "[16, 50] acc: 0.20000000298023224\n",
      "[16, 60] loss: 3.1397361278533937\n",
      "[16, 60] acc: 0.05000000074505806\n",
      "[16, 70] loss: 2.745982301235199\n",
      "[16, 70] acc: 0.20000000298023224\n",
      "[16, 80] loss: 2.806473696231842\n",
      "[16, 80] acc: 0.15000000596046448\n",
      "[16, 90] loss: 2.70146723985672\n",
      "[16, 90] acc: 0.10000000149011612\n",
      "[16, 100] loss: 2.6859867691993715\n",
      "[16, 100] acc: 0.15000000596046448\n",
      "[17, 10] loss: 2.395775890350342\n",
      "[17, 10] acc: 0.25\n",
      "[17, 20] loss: 2.8421038150787354\n",
      "[17, 20] acc: 0.10000000149011612\n",
      "[17, 30] loss: 2.701063704490662\n",
      "[17, 30] acc: 0.10000000149011612\n",
      "[17, 40] loss: 2.629694676399231\n",
      "[17, 40] acc: 0.25\n",
      "[17, 50] loss: 2.6568603992462156\n",
      "[17, 50] acc: 0.25\n",
      "[17, 60] loss: 2.9190653681755068\n",
      "[17, 60] acc: 0.15000000596046448\n",
      "[17, 70] loss: 2.453418469429016\n",
      "[17, 70] acc: 0.4000000059604645\n",
      "[17, 80] loss: 2.642978882789612\n",
      "[17, 80] acc: 0.25\n",
      "[17, 90] loss: 2.5420090913772584\n",
      "[17, 90] acc: 0.15000000596046448\n",
      "[17, 100] loss: 3.015761840343475\n",
      "[17, 100] acc: 0.10000000149011612\n",
      "[18, 10] loss: 2.7929662704467773\n",
      "[18, 10] acc: 0.20000000298023224\n",
      "[18, 20] loss: 2.6037694573402406\n",
      "[18, 20] acc: 0.25\n",
      "[18, 30] loss: 2.7072338342666624\n",
      "[18, 30] acc: 0.10000000149011612\n",
      "[18, 40] loss: 2.101508927345276\n",
      "[18, 40] acc: 0.3499999940395355\n",
      "[18, 50] loss: 2.813654589653015\n",
      "[18, 50] acc: 0.10000000149011612\n",
      "[18, 60] loss: 2.5265136837959288\n",
      "[18, 60] acc: 0.30000001192092896\n",
      "[18, 70] loss: 2.2835285782814028\n",
      "[18, 70] acc: 0.3499999940395355\n",
      "[18, 80] loss: 3.159716844558716\n",
      "[18, 80] acc: 0.05000000074505806\n",
      "[18, 90] loss: 2.5875296235084533\n",
      "[18, 90] acc: 0.30000001192092896\n",
      "[18, 100] loss: 2.524041175842285\n",
      "[18, 100] acc: 0.25\n",
      "[19, 10] loss: 2.136912775039673\n",
      "[19, 10] acc: 0.20000000298023224\n",
      "[19, 20] loss: 2.3204329013824463\n",
      "[19, 20] acc: 0.25\n",
      "[19, 30] loss: 2.913913035392761\n",
      "[19, 30] acc: 0.05000000074505806\n",
      "[19, 40] loss: 2.7256484270095824\n",
      "[19, 40] acc: 0.20000000298023224\n",
      "[19, 50] loss: 2.667298936843872\n",
      "[19, 50] acc: 0.10000000149011612\n",
      "[19, 60] loss: 2.550962209701538\n",
      "[19, 60] acc: 0.20000000298023224\n",
      "[19, 70] loss: 2.741114151477814\n",
      "[19, 70] acc: 0.15000000596046448\n",
      "[19, 80] loss: 2.8567130327224732\n",
      "[19, 80] acc: 0.10000000149011612\n",
      "[19, 90] loss: 2.6655471563339233\n",
      "[19, 90] acc: 0.15000000596046448\n",
      "[19, 100] loss: 2.4535067319869994\n",
      "[19, 100] acc: 0.10000000149011612\n",
      "[20, 10] loss: 2.3783928871154787\n",
      "[20, 10] acc: 0.30000001192092896\n",
      "[20, 20] loss: 2.3647433280944825\n",
      "[20, 20] acc: 0.30000001192092896\n",
      "[20, 30] loss: 2.8053562521934508\n",
      "[20, 30] acc: 0.15000000596046448\n",
      "[20, 40] loss: 2.8054837465286253\n",
      "[20, 40] acc: 0.10000000149011612\n",
      "[20, 50] loss: 2.920176386833191\n",
      "[20, 50] acc: 0.0\n",
      "[20, 60] loss: 2.7775943279266357\n",
      "[20, 60] acc: 0.15000000596046448\n",
      "[20, 70] loss: 2.5152003526687623\n",
      "[20, 70] acc: 0.20000000298023224\n",
      "[20, 80] loss: 2.309221464395523\n",
      "[20, 80] acc: 0.3499999940395355\n",
      "[20, 90] loss: 2.4018995642662047\n",
      "[20, 90] acc: 0.25\n",
      "[20, 100] loss: 2.379344570636749\n",
      "[20, 100] acc: 0.20000000298023224\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "--- Logging error ---\n",
      "Traceback (most recent call last):\n",
      "  File \"/opt/conda/lib/python3.7/logging/__init__.py\", line 1025, in emit\n",
      "    msg = self.format(record)\n",
      "  File \"/opt/conda/lib/python3.7/logging/__init__.py\", line 869, in format\n",
      "    return fmt.format(record)\n",
      "  File \"/opt/conda/lib/python3.7/logging/__init__.py\", line 608, in format\n",
      "    record.message = record.getMessage()\n",
      "  File \"/opt/conda/lib/python3.7/logging/__init__.py\", line 369, in getMessage\n",
      "    msg = msg % self.args\n",
      "TypeError: not all arguments converted during string formatting\n",
      "Call stack:\n",
      "  File \"/opt/conda/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n",
      "    \"__main__\", mod_spec)\n",
      "  File \"/opt/conda/lib/python3.7/runpy.py\", line 85, in _run_code\n",
      "    exec(code, run_globals)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py\", line 16, in <module>\n",
      "    app.launch_new_instance()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/traitlets/config/application.py\", line 664, in launch_instance\n",
      "    app.start()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelapp.py\", line 583, in start\n",
      "    self.io_loop.start()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/platform/asyncio.py\", line 149, in start\n",
      "    self.asyncio_loop.run_forever()\n",
      "  File \"/opt/conda/lib/python3.7/asyncio/base_events.py\", line 541, in run_forever\n",
      "    self._run_once()\n",
      "  File \"/opt/conda/lib/python3.7/asyncio/base_events.py\", line 1786, in _run_once\n",
      "    handle._run()\n",
      "  File \"/opt/conda/lib/python3.7/asyncio/events.py\", line 88, in _run\n",
      "    self._context.run(self._callback, *self._args)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/ioloop.py\", line 690, in <lambda>\n",
      "    lambda f: self._run_callback(functools.partial(callback, future))\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/ioloop.py\", line 743, in _run_callback\n",
      "    ret = callback()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 787, in inner\n",
      "    self.run()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 748, in run\n",
      "    yielded = self.gen.send(value)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 377, in dispatch_queue\n",
      "    yield self.process_one()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 225, in wrapper\n",
      "    runner = Runner(result, future, yielded)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 714, in __init__\n",
      "    self.run()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 748, in run\n",
      "    yielded = self.gen.send(value)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 361, in process_one\n",
      "    yield gen.maybe_future(dispatch(*args))\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 209, in wrapper\n",
      "    yielded = next(result)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 268, in dispatch_shell\n",
      "    yield gen.maybe_future(handler(stream, idents, msg))\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 209, in wrapper\n",
      "    yielded = next(result)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 541, in execute_request\n",
      "    user_expressions, allow_stdin,\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 209, in wrapper\n",
      "    yielded = next(result)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/ipkernel.py\", line 300, in do_execute\n",
      "    res = shell.run_cell(code, store_history=store_history, silent=silent)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/zmqshell.py\", line 536, in run_cell\n",
      "    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 2858, in run_cell\n",
      "    raw_cell, store_history, silent, shell_futures)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 2886, in _run_cell\n",
      "    return runner(coro)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/async_helpers.py\", line 68, in _pseudo_sync_runner\n",
      "    coro.send(None)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 3063, in run_cell_async\n",
      "    interactivity=interactivity, compiler=compiler, result=result)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 3254, in run_ast_nodes\n",
      "    if (await self.run_code(code, result,  async_=asy)):\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 3331, in run_code\n",
      "    exec(code_obj, self.user_global_ns, self.user_ns)\n",
      "  File \"<ipython-input-11-5dea1a607ad2>\", line 77, in <module>\n",
      "    correct = correct_rate(net, test_loader)\n",
      "  File \"<ipython-input-11-5dea1a607ad2>\", line 72, in correct_rate\n",
      "    logger.info(\"total的值为：\",total)\n",
      "Message: 'total的值为：'\n",
      "Arguments: (54.0,)\n",
      "--- Logging error ---\n",
      "Traceback (most recent call last):\n",
      "  File \"/opt/conda/lib/python3.7/logging/__init__.py\", line 1025, in emit\n",
      "    msg = self.format(record)\n",
      "  File \"/opt/conda/lib/python3.7/logging/__init__.py\", line 869, in format\n",
      "    return fmt.format(record)\n",
      "  File \"/opt/conda/lib/python3.7/logging/__init__.py\", line 608, in format\n",
      "    record.message = record.getMessage()\n",
      "  File \"/opt/conda/lib/python3.7/logging/__init__.py\", line 369, in getMessage\n",
      "    msg = msg % self.args\n",
      "TypeError: not all arguments converted during string formatting\n",
      "Call stack:\n",
      "  File \"/opt/conda/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n",
      "    \"__main__\", mod_spec)\n",
      "  File \"/opt/conda/lib/python3.7/runpy.py\", line 85, in _run_code\n",
      "    exec(code, run_globals)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py\", line 16, in <module>\n",
      "    app.launch_new_instance()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/traitlets/config/application.py\", line 664, in launch_instance\n",
      "    app.start()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelapp.py\", line 583, in start\n",
      "    self.io_loop.start()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/platform/asyncio.py\", line 149, in start\n",
      "    self.asyncio_loop.run_forever()\n",
      "  File \"/opt/conda/lib/python3.7/asyncio/base_events.py\", line 541, in run_forever\n",
      "    self._run_once()\n",
      "  File \"/opt/conda/lib/python3.7/asyncio/base_events.py\", line 1786, in _run_once\n",
      "    handle._run()\n",
      "  File \"/opt/conda/lib/python3.7/asyncio/events.py\", line 88, in _run\n",
      "    self._context.run(self._callback, *self._args)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/ioloop.py\", line 690, in <lambda>\n",
      "    lambda f: self._run_callback(functools.partial(callback, future))\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/ioloop.py\", line 743, in _run_callback\n",
      "    ret = callback()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 787, in inner\n",
      "    self.run()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 748, in run\n",
      "    yielded = self.gen.send(value)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 377, in dispatch_queue\n",
      "    yield self.process_one()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 225, in wrapper\n",
      "    runner = Runner(result, future, yielded)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 714, in __init__\n",
      "    self.run()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 748, in run\n",
      "    yielded = self.gen.send(value)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 361, in process_one\n",
      "    yield gen.maybe_future(dispatch(*args))\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 209, in wrapper\n",
      "    yielded = next(result)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 268, in dispatch_shell\n",
      "    yield gen.maybe_future(handler(stream, idents, msg))\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 209, in wrapper\n",
      "    yielded = next(result)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 541, in execute_request\n",
      "    user_expressions, allow_stdin,\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 209, in wrapper\n",
      "    yielded = next(result)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/ipkernel.py\", line 300, in do_execute\n",
      "    res = shell.run_cell(code, store_history=store_history, silent=silent)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/zmqshell.py\", line 536, in run_cell\n",
      "    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 2858, in run_cell\n",
      "    raw_cell, store_history, silent, shell_futures)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 2886, in _run_cell\n",
      "    return runner(coro)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/async_helpers.py\", line 68, in _pseudo_sync_runner\n",
      "    coro.send(None)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 3063, in run_cell_async\n",
      "    interactivity=interactivity, compiler=compiler, result=result)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 3254, in run_ast_nodes\n",
      "    if (await self.run_code(code, result,  async_=asy)):\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 3331, in run_code\n",
      "    exec(code_obj, self.user_global_ns, self.user_ns)\n",
      "  File \"<ipython-input-11-5dea1a607ad2>\", line 77, in <module>\n",
      "    correct = correct_rate(net, test_loader)\n",
      "  File \"<ipython-input-11-5dea1a607ad2>\", line 72, in correct_rate\n",
      "    logger.info(\"total的值为：\",total)\n",
      "Message: 'total的值为：'\n",
      "Arguments: (54.0,)\n",
      "81张测试集中准确率为： 27.77777862548828%\n",
      "[[1 0 0 ... 0 0 0]\n",
      " [1 0 0 ... 0 0 0]\n",
      " [0 0 0 ... 0 0 0]\n",
      " ...\n",
      " [0 0 0 ... 0 0 0]\n",
      " [0 0 0 ... 0 0 0]\n",
      " [0 0 0 ... 0 0 1]]\n",
      "--- Logging error ---\n",
      "Traceback (most recent call last):\n",
      "  File \"/opt/conda/lib/python3.7/logging/__init__.py\", line 1025, in emit\n",
      "    msg = self.format(record)\n",
      "  File \"/opt/conda/lib/python3.7/logging/__init__.py\", line 869, in format\n",
      "    return fmt.format(record)\n",
      "  File \"/opt/conda/lib/python3.7/logging/__init__.py\", line 608, in format\n",
      "    record.message = record.getMessage()\n",
      "  File \"/opt/conda/lib/python3.7/logging/__init__.py\", line 369, in getMessage\n",
      "    msg = msg % self.args\n",
      "TypeError: not all arguments converted during string formatting\n",
      "Call stack:\n",
      "  File \"/opt/conda/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n",
      "    \"__main__\", mod_spec)\n",
      "  File \"/opt/conda/lib/python3.7/runpy.py\", line 85, in _run_code\n",
      "    exec(code, run_globals)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py\", line 16, in <module>\n",
      "    app.launch_new_instance()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/traitlets/config/application.py\", line 664, in launch_instance\n",
      "    app.start()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelapp.py\", line 583, in start\n",
      "    self.io_loop.start()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/platform/asyncio.py\", line 149, in start\n",
      "    self.asyncio_loop.run_forever()\n",
      "  File \"/opt/conda/lib/python3.7/asyncio/base_events.py\", line 541, in run_forever\n",
      "    self._run_once()\n",
      "  File \"/opt/conda/lib/python3.7/asyncio/base_events.py\", line 1786, in _run_once\n",
      "    handle._run()\n",
      "  File \"/opt/conda/lib/python3.7/asyncio/events.py\", line 88, in _run\n",
      "    self._context.run(self._callback, *self._args)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/ioloop.py\", line 690, in <lambda>\n",
      "    lambda f: self._run_callback(functools.partial(callback, future))\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/ioloop.py\", line 743, in _run_callback\n",
      "    ret = callback()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 787, in inner\n",
      "    self.run()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 748, in run\n",
      "    yielded = self.gen.send(value)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 377, in dispatch_queue\n",
      "    yield self.process_one()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 225, in wrapper\n",
      "    runner = Runner(result, future, yielded)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 714, in __init__\n",
      "    self.run()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 748, in run\n",
      "    yielded = self.gen.send(value)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 361, in process_one\n",
      "    yield gen.maybe_future(dispatch(*args))\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 209, in wrapper\n",
      "    yielded = next(result)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 268, in dispatch_shell\n",
      "    yield gen.maybe_future(handler(stream, idents, msg))\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 209, in wrapper\n",
      "    yielded = next(result)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 541, in execute_request\n",
      "    user_expressions, allow_stdin,\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 209, in wrapper\n",
      "    yielded = next(result)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/ipkernel.py\", line 300, in do_execute\n",
      "    res = shell.run_cell(code, store_history=store_history, silent=silent)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/zmqshell.py\", line 536, in run_cell\n",
      "    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 2858, in run_cell\n",
      "    raw_cell, store_history, silent, shell_futures)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 2886, in _run_cell\n",
      "    return runner(coro)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/async_helpers.py\", line 68, in _pseudo_sync_runner\n",
      "    coro.send(None)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 3063, in run_cell_async\n",
      "    interactivity=interactivity, compiler=compiler, result=result)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 3254, in run_ast_nodes\n",
      "    if (await self.run_code(code, result,  async_=asy)):\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 3331, in run_code\n",
      "    exec(code_obj, self.user_global_ns, self.user_ns)\n",
      "  File \"<ipython-input-11-5dea1a607ad2>\", line 90, in <module>\n",
      "    logger.info('the running time is', time.time() - startTime)\n",
      "Message: 'the running time is'\n",
      "Arguments: (3975.714070081711,)\n",
      "--- Logging error ---\n",
      "Traceback (most recent call last):\n",
      "  File \"/opt/conda/lib/python3.7/logging/__init__.py\", line 1025, in emit\n",
      "    msg = self.format(record)\n",
      "  File \"/opt/conda/lib/python3.7/logging/__init__.py\", line 869, in format\n",
      "    return fmt.format(record)\n",
      "  File \"/opt/conda/lib/python3.7/logging/__init__.py\", line 608, in format\n",
      "    record.message = record.getMessage()\n",
      "  File \"/opt/conda/lib/python3.7/logging/__init__.py\", line 369, in getMessage\n",
      "    msg = msg % self.args\n",
      "TypeError: not all arguments converted during string formatting\n",
      "Call stack:\n",
      "  File \"/opt/conda/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n",
      "    \"__main__\", mod_spec)\n",
      "  File \"/opt/conda/lib/python3.7/runpy.py\", line 85, in _run_code\n",
      "    exec(code, run_globals)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py\", line 16, in <module>\n",
      "    app.launch_new_instance()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/traitlets/config/application.py\", line 664, in launch_instance\n",
      "    app.start()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelapp.py\", line 583, in start\n",
      "    self.io_loop.start()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/platform/asyncio.py\", line 149, in start\n",
      "    self.asyncio_loop.run_forever()\n",
      "  File \"/opt/conda/lib/python3.7/asyncio/base_events.py\", line 541, in run_forever\n",
      "    self._run_once()\n",
      "  File \"/opt/conda/lib/python3.7/asyncio/base_events.py\", line 1786, in _run_once\n",
      "    handle._run()\n",
      "  File \"/opt/conda/lib/python3.7/asyncio/events.py\", line 88, in _run\n",
      "    self._context.run(self._callback, *self._args)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/ioloop.py\", line 690, in <lambda>\n",
      "    lambda f: self._run_callback(functools.partial(callback, future))\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/ioloop.py\", line 743, in _run_callback\n",
      "    ret = callback()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 787, in inner\n",
      "    self.run()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 748, in run\n",
      "    yielded = self.gen.send(value)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 377, in dispatch_queue\n",
      "    yield self.process_one()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 225, in wrapper\n",
      "    runner = Runner(result, future, yielded)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 714, in __init__\n",
      "    self.run()\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 748, in run\n",
      "    yielded = self.gen.send(value)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 361, in process_one\n",
      "    yield gen.maybe_future(dispatch(*args))\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 209, in wrapper\n",
      "    yielded = next(result)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 268, in dispatch_shell\n",
      "    yield gen.maybe_future(handler(stream, idents, msg))\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 209, in wrapper\n",
      "    yielded = next(result)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 541, in execute_request\n",
      "    user_expressions, allow_stdin,\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/tornado/gen.py\", line 209, in wrapper\n",
      "    yielded = next(result)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/ipkernel.py\", line 300, in do_execute\n",
      "    res = shell.run_cell(code, store_history=store_history, silent=silent)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/ipykernel/zmqshell.py\", line 536, in run_cell\n",
      "    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 2858, in run_cell\n",
      "    raw_cell, store_history, silent, shell_futures)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 2886, in _run_cell\n",
      "    return runner(coro)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/async_helpers.py\", line 68, in _pseudo_sync_runner\n",
      "    coro.send(None)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 3063, in run_cell_async\n",
      "    interactivity=interactivity, compiler=compiler, result=result)\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 3254, in run_ast_nodes\n",
      "    if (await self.run_code(code, result,  async_=asy)):\n",
      "  File \"/opt/conda/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 3331, in run_code\n",
      "    exec(code_obj, self.user_global_ns, self.user_ns)\n",
      "  File \"<ipython-input-11-5dea1a607ad2>\", line 90, in <module>\n",
      "    logger.info('the running time is', time.time() - startTime)\n",
      "Message: 'the running time is'\n",
      "Arguments: (3975.714070081711,)\n",
      "/opt/conda/lib/python3.7/site-packages/torch/serialization.py:402: UserWarning: Couldn't retrieve source code for container of type Net. It won't be checked for correctness upon loading.\n",
      "  \"type \" + obj.__name__ + \". It won't be checked \"\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "torch.cuda.set_device(1)\n",
    "\n",
    "if __name__ == '__main__':\n",
    "    for epoch in range(epochs):\n",
    "        running_loss = 0.0\n",
    "        running_acc = 0.0\n",
    "\n",
    "        for i, data in enumerate(train_loader):\n",
    "#             print(\"i:\", i )\n",
    "#             print(\"data: \", data)\n",
    "            inputs, labels = data\n",
    "            optimizer.zero_grad()\n",
    "\n",
    "            inputs = inputs.permute(0, 2, 1)\n",
    "            inputs = torch.tensor(inputs, dtype=torch.float32)\n",
    "            outputs = net(inputs)\n",
    "            _, predicted = torch.max(outputs.data, dim=1)\n",
    "            total = labels.size(0)\n",
    "#             print('原来的值:{0}, 预测的值:{1}'.format(labels, predicted))\n",
    "            running_correct = (predicted == labels).sum()\n",
    "            running_acc += running_correct\n",
    "            loss = criterion(outputs, labels)\n",
    "            running_loss += loss.item()\n",
    "            loss.backward()\n",
    "            optimizer.step()\n",
    "\n",
    "            # 每loopNum个batch打印一次训练状态\n",
    "            loopNum = 10\n",
    "            if i % loopNum == loopNum - 1:\n",
    "                average_loss = running_loss / loopNum\n",
    "                logger.info('[{0}, {1}] loss: {2}'.format(epoch + 1, i + 1, average_loss))\n",
    "                running_acc = running_acc.float()\n",
    "                average_acc = running_acc / loopNum / total\n",
    "                \n",
    "                logger.info('[{0}, {1}] acc: {2}'.format(epoch + 1, i + 1, average_acc))\n",
    "                average_loss_series.append(average_loss)\n",
    "                running_loss = 0.0\n",
    "                running_acc = 0.0\n",
    "\n",
    "    x = range(0, len(average_loss_series))\n",
    "    plt.figure()\n",
    "    plt.plot(x, average_loss_series)\n",
    "    plt.show()\n",
    "    # %%\n",
    "    # 在测试集上测试\n",
    "    realLabel = []\n",
    "    predictedLabel = []\n",
    "\n",
    "\n",
    "    def correct_rate(net, testloader):\n",
    "        correct = 0.0\n",
    "        total = 0.0\n",
    "\n",
    "        for data in testloader:\n",
    "            images, labels = data\n",
    "            realLabel.append([int(label) for label in labels])\n",
    "            images = images.permute(0, 2, 1).float()\n",
    "#             print(\"--------!!---------\", images)\n",
    "#             print(images.shape)\n",
    "            outputs = net(images)\n",
    "\n",
    "            _, predicted = torch.max(outputs.data, dim=1)\n",
    "            predictedLabel.append([int(label) for label in predicted])\n",
    "            total += labels.size(0)\n",
    "            correct += (predicted == labels).sum()\n",
    "#             print(\"predicted的值为：\" , predicted)\n",
    "#             print(\"labels的值为：\" , labels)\n",
    "#             print(\"correct的值为:\", correct)\n",
    "            \n",
    "        logger.info(\"total的值为：\",total)\n",
    "#         return 100 * correct  # / total\n",
    "        return 100 * correct/ total \n",
    "\n",
    "\n",
    "    correct = correct_rate(net, test_loader)\n",
    "    logger.info(f'{len(test_loader) * 3}张测试集中准确率为： {correct}%')\n",
    "\n",
    "    # %%\n",
    "    import itertools\n",
    "    from sklearn.metrics import confusion_matrix\n",
    "\n",
    "    realLabel = list(itertools.chain.from_iterable(realLabel))\n",
    "    predictedLabel = list(itertools.chain.from_iterable(predictedLabel))\n",
    "\n",
    "    cm = confusion_matrix(realLabel, predictedLabel)\n",
    "    logger.info(cm)\n",
    "\n",
    "    logger.info('the running time is', time.time() - startTime)\n",
    "    torch.save(net, f'/workspace/DATASET/model_{pixel}_{flag}.pkl')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "A5YnF55DLq90"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([400, 160])\n",
      "tensor([[[-0.9158, -0.8935, -0.5384,  ...,  1.0396,  0.9079,  0.8218],\n",
      "         [ 0.4170,  0.5691,  0.8295,  ..., -0.0169, -0.4196, -0.6034],\n",
      "         [ 0.8424,  0.9747,  0.9501,  ...,  0.9841,  0.9175,  0.7206],\n",
      "         ...,\n",
      "         [-1.0081, -0.9780, -0.9348,  ..., -0.4165, -0.7499, -0.9122],\n",
      "         [ 0.0505,  0.0280,  0.3108,  ...,  0.9509,  0.8024,  0.4855],\n",
      "         [-0.9813, -0.9964, -0.9769,  ..., -0.2397, -0.6018, -0.8310]],\n",
      "\n",
      "        [[ 0.2162,  0.4887,  0.8449,  ...,  0.5204,  0.1634,  0.0304],\n",
      "         [ 0.9414,  0.8517,  0.5693,  ..., -0.8505, -0.9652, -0.9822],\n",
      "         [ 0.2283,  0.5079,  0.8619,  ...,  0.5971,  0.2591,  0.1168],\n",
      "         ...,\n",
      "         [-0.9775, -0.8437, -0.5305,  ..., -0.7422, -0.9444, -0.9132],\n",
      "         [ 0.1253,  0.4580,  0.8271,  ...,  0.6463,  0.2368,  0.0547],\n",
      "         [-0.9623, -0.8596, -0.5944,  ..., -0.7257, -0.9501, -0.9887]]],\n",
      "       dtype=torch.float64)\n"
     ]
    }
   ],
   "source": [
    "aa = iter(train_loader)\n",
    "a, b = aa.next()\n",
    "print(a[0].shape)\n",
    "print(a)"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "name": "3_设计并训练神经网络.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
